package fr.n7.khome.view;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Rectangle;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.List;
import java.util.Vector;

import javax.swing.BorderFactory;
import javax.swing.DefaultCellEditor;
import javax.swing.ImageIcon;
import javax.swing.JComboBox;
import javax.swing.JEditorPane;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JSplitPane;
import javax.swing.JTabbedPane;
import javax.swing.ListSelectionModel;

import fr.n7.khome.core.Fuzzy;
import fr.n7.khome.core.Request;
import fr.n7.khome.model.Lodging;
import fr.n7.khome.model.LodgingType;
import fr.n7.khome.view.editors.ImportanceEditor;
import fr.n7.khome.view.editors.JFuzzyEditor;
import fr.n7.khome.view.renderer.FuzzyRenderer;
import fr.n7.khome.view.renderer.ImportanceRenderer;
import fr.n7.khome.view.renderer.LodgingTypeRenderer;
import fr.n7.khome.view.renderer.ResultFieldRenderer;

public class PrincipalFrame extends JFrame implements MouseListener {
	/**
	 * 
	 */
	private static final long serialVersionUID = 4525748855722811352L;

	KHomeRequestTableModel<List<Request>> requestTableModel;
	KHomeResultTableModel<List<Request>> resultTableModel;
	KHomeTable requestTable;
	KHomeTable resultTable;

	JPanel header;
	JSplitPane jsp;

	public PrincipalFrame(){
		super("KHome");
		
		header = createHeader();
		
		createTables();

		//Create the request panel (containing a title and a table).
		JScrollPane requestScrollPane = new JScrollPane(requestTable, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
		JPanel requestPane = new JPanel(new BorderLayout());
		JEditorPane requestTitle = new JEditorPane("text/html", 
				"<html><DIV ALIGN=\"CENTER\"><FONT color=\"#0000DD\" size=6>" +
				"<b>Request</b>"+
		"</FONT></DIV></html>");
		requestTitle.setEditable(false);
		requestPane.add(requestTitle,BorderLayout.NORTH);
		requestPane.add(requestScrollPane,BorderLayout.CENTER);

		//Create the result panel (containing a title and a table).
		JScrollPane resultScrollPane= new JScrollPane(resultTable, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
		JPanel resultsPane = new JPanel(new BorderLayout());
		JEditorPane resultsTitle = new JEditorPane("text/html", 
				"<html><DIV ALIGN=\"CENTER\"><FONT color=\"#0000DD\" size=6>" +
				"<b>Results</b>"+
		"</FONT></DIV></html>");
		resultsTitle.setEditable(false);
		resultsPane.add(resultsTitle,BorderLayout.NORTH);
		resultsPane.add(resultScrollPane,BorderLayout.CENTER);

		//Create the tables panel (request and result tables).
		JPanel tablesPanel = new JPanel();
		tablesPanel.setLayout(new BorderLayout());
		tablesPanel.add(requestPane, BorderLayout.NORTH);
		tablesPanel.add(resultsPane, BorderLayout.CENTER);

		// SplitPane séparating header et tables

		jsp = new JSplitPane(JSplitPane.VERTICAL_SPLIT, header, tablesPanel);
		jsp.setEnabled(false);
		jsp.setOneTouchExpandable(true);

		add(jsp);

		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setExtendedState(JFrame.MAXIMIZED_BOTH);
		setIconImage(new ImageIcon("img/KHome.png").getImage());

//		Display the window.
		pack();
		Rectangle bounds = getGraphicsConfiguration().getBounds();
		Dimension d = bounds.getSize();
		setSize((int)(d.getWidth()*3/4), (int)(d.getHeight()*3/4));
		setLocation((int)(d.getWidth()*1/8), (int)(d.getHeight()*1/8));
		setVisible(true);
	}

	private void createTables(){
		String[] requestColumnNames = {
				"",
				"Type",
				"Price (k€)",
				"Live Surface (m²)",
				"Field Surface (m²)",
				"Age (years)",
		"Work percent price (%)"};

		String[] resultsColumnNames = {
				"Id",
				"Type",
				"Price (k€)",
				"Live Surface (m²)",
				"Field Surface (m²)",
				"Age (years)",
		"Work percent price (%)"};

		Vector<Request> requests = new Vector<Request>();
		Fuzzy q = Fuzzy.whateverFuzzy();
		Request r = new Request(new Lodging(q,LodgingType.WHATEVER,q,q,q,q),5);
		requests.add(r);
		requests.add(r);

		resultTable = new KHomeTable();
		requestTable = new KHomeTable();

		resultTableModel = new KHomeResultTableModel<List<Request>>(resultsColumnNames, resultTable, requestTable);
		resultTable.setModel(resultTableModel);

		requestTableModel = new KHomeRequestTableModel<List<Request>>(requestColumnNames, requests, requestTable, resultTable);
		requestTable.setModel(requestTableModel);

		requestTable.getColumnModel().getColumn(0).setMaxWidth(80);
		resultTable.getColumnModel().getColumn(0).setMaxWidth(80);

		requestTable.setPreferredScrollableViewportSize(new Dimension(500, 140));
		requestTable.getModel().addTableModelListener(requestTableModel);
		requestTable.getColumnModel().addColumnModelListener(requestTableModel);
		resultTable.getColumnModel().addColumnModelListener(resultTableModel);

		requestTable.setRowHeight(0, 40);
		requestTable.setRowHeight(1, 100);

		JComboBox comboBox = new JComboBox(LodgingType.values());
		requestTable.setDefaultEditor(LodgingType.class, new DefaultCellEditor(comboBox));
		requestTable.setDefaultRenderer(LodgingType.class, new LodgingTypeRenderer());

		requestTable.setDefaultEditor(Fuzzy.class, new JFuzzyEditor(resultTableModel));
		requestTable.setDefaultRenderer(Fuzzy.class, new FuzzyRenderer());

		requestTable.setDefaultEditor(Integer.class, new ImportanceEditor(resultTableModel));
		requestTable.setDefaultRenderer(Integer.class, new ImportanceRenderer());

		resultTable.setDefaultRenderer(ResultField.class, new ResultFieldRenderer());

		requestTable.setSelectionBackground(Color.white);

		requestTableModel.majImportances();
		resultTableModel.updateResultsWithRequests(requests);

		resultTable.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
	}
	
	private JPanel createHeader() {
		//Create the header (Icon and help tabbed pane)
		JPanel header = new JPanel();
		header.setLayout(new BorderLayout());
		JLabel iconLabel = new JLabel("WelKHome !!",new ImageIcon("img/KHome.png"),JLabel.CENTER);

		JLabel clicToHide = new JLabel("(Click to hide)", JLabel.CENTER);

		JPanel iconPanel = new JPanel(new BorderLayout());
		iconPanel.add(iconLabel, BorderLayout.CENTER);
		iconPanel.add(clicToHide, BorderLayout.SOUTH);

		iconLabel.setVerticalTextPosition(JLabel.BOTTOM);
		iconLabel.setHorizontalTextPosition(JLabel.CENTER);
		iconPanel.setBorder(BorderFactory.createRaisedBevelBorder());
		header.add(iconPanel, BorderLayout.WEST);

		// Listener to hide header
		iconLabel.addMouseListener(this);
		iconPanel.addMouseListener(this);
		//------------------ Aide ------------------

		JTabbedPane help = new JTabbedPane();

		// Accueil
		help.add(newTab(false,
				"<b>Khome ON</b>"+
				"<br><br>Pour obtenir des détails sur l'implémentation, <b color=\"#DD5555\">un fichier README peut-être trouvé à la racine</b>."+
				"<br>Cliquez sur un onglet ci-dessus pour obtenir l'aide correspondant à son label."+
		"<br><br>Just be KHome addict !")
		, "WelKHome");

		// Effectuer une requête
		help.add(newTab(false,
				"Pour effectuer une requête, <b>éditez les champs</b>, la mise à jour des résultats est automatique et en temps réel." +
				"<br>Le détail sur le tri et l'affichage des résultats est disponible dans l'onglet <b>\"Les Résultats\"</b>" +
				"<br>L'aide sur l'édition des cellules est disponibles dans les onglets <b>\"Editer une importance\"</b>" +
		"et <b>\"Editer les données de la requête\"</b>.")
		, "Effectuer une requête");

		// Editer les importances
		help.add(newTab(false,
				"Pour éditer les importances, <b>cliquez</b> sur la zone à éditer : un slider s'affiche." +
		"<br>En <b>déplacant</b> celui-ci, l'importance du champ correspondant est mise à jour.")
		, "Editer les importances");

		// Editer les doonées de la requête
		help.add(newTab(false,
				"Pour éditer les données de la requête, <b>cliquez</b> sur la zone à éditer : deux solutions s'offrent ensuite à vous :" +
				"<ul>" +
				"<li><b>Editer au clavier</b> la zone de texte située au bas de la cellule.</li>"+
				"<li><b>Editer à la souris</b> en faisant glisser les barres de contrôle vers la gauche ou vers la droite " +
		"et/ou en cochant ou décochant les case +∞ et -∞.</li>")
		, "Editer les données de la requête");

		// Les Résultats
		help.add(newTab(false,
				"<b>Les résultats sont triés de haut en bas, du meilleur au moins bon</b> (par ordre de Nécessité globale," +
				" puis Possibilité globale, somme des Nécessités, somme des Possibilités et enfin ids)." +
				"<br>Les couleurs des cellules décrivent les Nécessités et Possibilités locales par des dégradés entre les couleurs principales :" +
				"<ul>" +
				" <li>Le <b color=\"#55BB77\">vert</b> correspond à une Nécessité et une Possibilité maximale."+
				" <li>Le <b color=\"#AAAA55\">jaune</b> correspond à une Nécessité minimale et une Possibilité maximale."+
				" <li>Le <b color=\"#DD5555\">rouge</b> correspond à une Nécessité et une Possibilité minimale."+
				"</ul>"+
		"La transparence des lignes décrit la Nécessité globale.")
		, "Les Résultats");

		// Write what you want ..
		help.add(newTab(true,""), "Write what you want here...");
		header.add(help, BorderLayout.CENTER);
		
		return header;
	}
	
	private Component newTab(boolean editable, String htmlText) {
		JEditorPane tab = new JEditorPane("text/html", 
				"<html>" +htmlText+"</html>");
		tab.setEditable(editable);
		return new JScrollPane(tab);
	}

	public float getMaxGLikelyhood(){
		return resultTableModel.getMaxGLikelyhood();
	}
	public static void main(String[] args) {
		new PrincipalFrame();
	}

	@Override
	public void mouseClicked(MouseEvent arg0) {
		jsp.setDividerLocation(0);
	}

	@Override
	public void mouseEntered(MouseEvent arg0) {}

	@Override
	public void mouseExited(MouseEvent arg0) {}

	@Override
	public void mousePressed(MouseEvent arg0) {}

	@Override
	public void mouseReleased(MouseEvent arg0) {}
}
